#include <cstdio>
#include <string>
using namespace std;


// 结构体
// 创建Student类型
struct Student{
    int id;
    string name;
    char gender;
    short age;
};
void printStu(Student stu);
void printStu(Student * pstu);

int main(){
    // 通过学生类型创建具体学生
    // 第1种创建结构体变量的方式
    Student stu1;
    stu1.id = 1;
    stu1.name = "Nasa";
    stu1.gender = 'm';
    stu1.age = 9;
    printStu(stu1);
    // 第2种创建结构体变量的方式
    Student stu2 = {2,"lin",'m',41};
    printStu(&stu2);
    // printf("id:%d,name:%s,gender:%c,age:%d\n",stu2.id,stu2.name.c_str(),stu2.gender,stu2.age);

    // 结构体数组
    Student stus[4]={stu1,stu2,{3,"ANN",'f',35}};
    printf("struct array\n");
    for (int i = 0; i<sizeof(stus)/sizeof(stus[0]);i++){
        printf("id:%d,name:%s,gender:%c,age:%d\n",
        stus[i].id,stus[i].name.c_str(),stus[i].gender,stus[i].age);
    }

    // 结构体指针
    // 使用->访问结构体中的属性
    Student * pstu = &stu1;
    int a = pstu->age;
    printf("a: %d\n",a);

    return 0;
}

// 结构体作为参数, 按值传递
void printStu(Student stu){
    printf("value:  id:%d,name:%s,gender:%c,age:%d\n",
    stu.id,stu.name.c_str(),stu.gender,stu.age);
}

// 结构体作为参数, 按引用传递
void printStu(const Student * pstu){
    // pstu->age=20; // 形参前加const, 不得对变量内容进行修改, 否则编译错误
    printf("print:  id:%d,name:%s,gender:%c,age:%d\n",
    pstu->id,pstu->name.c_str(),pstu->gender,pstu->age);
}